home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 683 / printfiles / source.lha / Source / prf_print.c < prev    next >
C/C++ Source or Header  |  1992-06-16  |  9KB  |  307 lines

  1. /* prf_print.c  */
  2. /* V091 14-3-92 */
  3.  
  4. #include "prf.h"
  5.  
  6. char  *dayname[]=
  7.        {
  8.         T_SUNDAY,T_MONDAY,T_TUESDAY,T_WEDNESDAY,T_THURSDAY,T_FRIDAY,T_SATURDAY
  9.        };
  10. char  *monthname[]=
  11.        {
  12.         T_JAN,T_FEB,T_MAR,T_APR,T_MAY,T_JUNE,T_JULY,T_AUG,T_SEP,T_OCT,T_NOV,T_DEC
  13.        };
  14.  
  15. long __regargs BuildStatusline(struct prf_info *,UBYTE *);
  16. long __regargs CheckFile(struct prf_info *,UBYTE *);
  17. long __regargs PopFile(struct prf_info *,UBYTE *);
  18. void __regargs PushFile(struct prf_info *,UBYTE *);
  19. long __regargs PrintText(struct prf_info *,UBYTE *);
  20.  
  21.  
  22. void __regargs PrintQueue(struct prf_info *info)
  23. {
  24.  long               end = FALSE;
  25.  UBYTE              filename[STR_SIZE];
  26.  FILE              *display = NULL;
  27.  info->flags.print = 1;
  28.  if(info->Swd)
  29.  {
  30.   strncpy(info->Headline,((struct StringInfo *)info->SGadgets[GD_Headline]->SpecialInfo)->Buffer,STR_SIZE);
  31.   strncpy(info->Footline,((struct StringInfo *)info->SGadgets[GD_Footline]->SpecialInfo)->Buffer,STR_SIZE);
  32.   GT_SetGadgetAttrs(info->SGadgets[GD_Print],info->Swd,NULL,GA_Disabled,TRUE,TAG_DONE);
  33.   SwdTags[0].ti_Data = (ULONG)info->Swd->LeftEdge;
  34.   SwdTags[1].ti_Data = (ULONG)info->Swd->TopEdge;
  35.  }
  36.  if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_PPrint - PGD],info->Pwd,NULL,GA_Disabled,TRUE,TAG_DONE);
  37.  sprintf(filename,"CON:%ld/%ld/%ld/%ld/%s",
  38.                    SwdTags[0].ti_Data,SwdTags[1].ti_Data,
  39.                    SwdTags[2].ti_Data,info->BarHeight * 4,T_DISPLAYNAME);
  40.  if((info->flags.display) && ((info->Pwd) || (info->Swd)))
  41.     display = fopen(filename,"w");
  42.  while (!end  && PopFile(info,filename))
  43.  {
  44.   if(display)fprintf(display,"\n%s",filename);
  45.   switch(CheckFile(info,filename))
  46.   {
  47.    case FILE_TEXT : if(PrintText(info,filename) == CMD_QUIT) end = TRUE;
  48.                     info->Special1 = (APTR)filename;
  49.                     RemoveName(info);
  50.                     info->Special1 = NULL;
  51.                     break;
  52.    case FILE_PROG : switch(info->flags.prog)
  53.                     {
  54.                      case 0 : break;
  55.                      case 1 : PrintProgInfo(info,filename);
  56.                               break;
  57.                      case 2 :
  58.                      case 3 : if(info->flags.prog == 3) PrintProgInfo(info,filename);
  59.                               switch(info->flags.icon)
  60.                               {
  61.                                case 0: break;
  62.                                case 1: PrintIconGfx(info,filename); break;
  63.                                case 2: PrintIconInfo(info,filename);  break;
  64.                                case 3: PrintIconInfo(info,filename);
  65.                                        PrintIconGfx(info,filename);
  66.                                        break;
  67.                               }
  68.                               break;
  69.                     }
  70.                     break;
  71.    case FILE_DIR  :
  72.    case FILE_ICON : switch(info->flags.icon)
  73.                     {
  74.                      case 0: break;
  75.                      case 1: PrintIconGfx(info,filename); break;
  76.                      case 2: PrintIconInfo(info,filename);  break;
  77.                      case 3: PrintIconInfo(info,filename);
  78.                              PrintIconGfx(info,filename);
  79.                              break;
  80.                     }
  81.                     break;
  82.    case FILE_ILBM : if(display)fprintf(display,ERROR_ILBM);break;
  83.    case FILE_FTXT : if(display)fprintf(display,ERROR_FTXT);break;
  84.    default        : end = TRUE;
  85.                     break;
  86.   }
  87.  }
  88.  if(display) fclose(display);
  89.  if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_PPrint - PGD],info->Pwd,NULL,GA_Disabled,FALSE,TAG_DONE);
  90.  if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Print],info->Swd,NULL,GA_Disabled,FALSE,TAG_DONE);
  91.  info->flags.print = 0;
  92. }
  93.  
  94. long __regargs PrintText(struct prf_info *info,UBYTE *name)
  95. {
  96.  long rc     = CMD_NEUTRAL;
  97.  long line   = 0;
  98.  long lines  = 1;
  99.  long page   = 1;
  100.  long offset;
  101.  FILE *printer;
  102.  FILE *file;
  103.  UBYTE buffer[STR_SIZE];
  104.  long end = FALSE;
  105.  if(file = fopen(name,"r"))
  106.  {
  107.   if(printer = fopen("prt:","w"))
  108.   {
  109.    PrintSettings(info,printer);
  110.    if(info->Columns <= 0L) info->Columns = 1L;
  111.    fprintf(printer,"\x1b[%ld;%lds",info->Lmargin,info->Rmargin);
  112.    offset = BuildStatusline(info,name);
  113.    while(!end)
  114.    {
  115.     if(fgets(buffer,STR_SIZE,file))
  116.     {
  117.      if(DoCommand(info,HandleMsgs(info)) == CMD_QUIT)
  118.      {
  119.       end = TRUE;
  120.       rc  = CMD_QUIT;
  121.      }
  122.      if(line == (info->Lines - offset))
  123.      {
  124.       if(*(info->Footline))
  125.       {
  126.        fprintf(printer,"%s\n",info->Footline);
  127.        if (strlen(info->Footline) > info->Columns) line += strlen(info->Footline)/info->Columns;
  128.       }
  129.       if(info->flags.page) fprintf(printer,"*** " T_PAGE ": %5d ***",page);
  130.       if(info->flags.ffpage) fprintf(printer,"\f");
  131.       line = 0;page++;
  132.      }
  133.      if(line == 0)
  134.      {
  135.       if(*(info->Statusline))
  136.       {
  137.        fprintf(printer,"%s\n",info->Statusline);
  138.        if (strlen(info->Statusline) > info->Columns) line += strlen(info->Statusline)/info->Columns;
  139.       }
  140.       if(*(info->Headline))
  141.       {
  142.        fprintf(printer,"%s\n\n",info->Headline);
  143.        if (strlen(info->Headline) > info->Columns) line += strlen(info->Headline)/info->Columns;
  144.       }
  145.      }
  146.      if(info->flags.line)
  147.      {
  148.       fprintf(printer,"%5d:%s",lines,buffer) ;
  149.       if (strlen(buffer) > info->Columns) line += strlen(buffer)/info->Columns;
  150.      }
  151.      else
  152.      {
  153.       fprintf(printer,"%s",buffer);
  154.       if (strlen(buffer) > info->Columns) line += strlen(buffer)/info->Columns;
  155.      }
  156.      line++,lines++;
  157.     }
  158.     else end = TRUE;
  159.    }
  160.    if(*(info->Footline))fprintf(printer,"%s\n",info->Footline);
  161.    if(info->flags.page) fprintf(printer,"*** %5d " T_PAGES T_PRINTED "***\n",page);
  162.    if(info->flags.ff) fprintf(printer,"\f");
  163.    fclose(printer);
  164.    switch(info->flags.icon)
  165.    {
  166.     case 0: break;
  167.     case 1: PrintIconGfx(info,name); break;
  168.     case 2: PrintIconInfo(info,name);  break;
  169.     case 3: PrintIconInfo(info,name);
  170.             PrintIconGfx(info,name);
  171.             break;
  172.    }
  173.   }
  174.   else
  175.   {
  176.    PushFile(info,name); /* file not found */
  177.   }
  178.   fclose(file);
  179.  }
  180.  return rc;
  181. }
  182.  
  183. long __regargs CheckFile(struct prf_info *info, UBYTE *name)
  184. {
  185.  long rc = FILE_TEXT;
  186.  struct FileInfoBlock *fib;
  187.  BPTR fh,lock;
  188.  if(stricmp(name + (strlen(name) - 5), ".info"))
  189.  {
  190.   if(fib = (struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))
  191.   {
  192.    if(lock = Lock(name,ACCESS_READ))
  193.    {
  194.     if(Examine(lock,fib))
  195.     {
  196.      if(fib->fib_DirEntryType > 0)
  197.      {
  198.       rc = FILE_DIR;
  199.      }
  200.      else
  201.      {
  202.       if(!(fib->fib_Protection & FIBB_SCRIPT))
  203.       {
  204.        if(fh = Open(name,MODE_OLDFILE))
  205.        {
  206.         UBYTE b[10];
  207.         if(Read(fh,b,4))
  208.         if(!(strnicmp(b,"\00\00\03\f3",4)))
  209.         {
  210.          rc = FILE_PROG;
  211.         }
  212.         if( (!(strnicmp(b,"form",4))) || (!(strnicmp(b,"list",4))) ||
  213.             (!(strnicmp(b,"prop",4))) || (!(strnicmp(b,"cat" ,3)))
  214.           )
  215.         {
  216.          Read(fh,b,4);  /* read length of file */
  217.          Read(fh,b,4);  /* read form type */
  218.          if(!(strnicmp(b,"ftxt",4)))rc = FILE_FTXT;
  219.           else if(!(strnicmp(b,"ilbm",4)))rc = FILE_ILBM;
  220.            else rc = FILE_UNKNOWN;
  221.         }
  222.         Close(fh);
  223.        }
  224.       }
  225.      }
  226.     }
  227.     UnLock(lock);
  228.    }
  229.    FreeDosObject(DOS_FIB,(APTR)fib);
  230.   }
  231.  }
  232.  else rc = FILE_ICON;
  233.  return rc;
  234. }
  235.  
  236. long __regargs PopFile(struct prf_info *info,UBYTE *name)
  237. {
  238.  long rc = FALSE;
  239.  struct FileNameNode *fnn;
  240.  DetachList(info);
  241.  if(fnn = (struct FileNameNode *)RemHead(&info->FileList))
  242.  {
  243.   if(*(fnn->fnn_Name))
  244.   {
  245.    rc = TRUE;
  246.    strcpy(name,fnn->fnn_Name);
  247.    free(fnn);
  248.   }
  249.  }
  250.  AttachList(info);
  251.  return rc;
  252. }
  253.  
  254. void __regargs PushFile(struct prf_info *info,UBYTE *name)
  255. {
  256.  struct FileNameNode *fnn;
  257.  if(*name)
  258.  {
  259.   if(fnn = calloc(1,sizeof(struct FileNameNode)))
  260.   {
  261.    strcpy(fnn->fnn_Name,name);
  262.    fnn->fnn_Node.ln_Name = fnn->fnn_Name;
  263.    DetachList(info);
  264.    AddHead(&info->FileList,(struct Node *)fnn);
  265.    AttachList(info);
  266.   }
  267.  }
  268. }
  269.  
  270. long __regargs BuildStatusline(struct prf_info *info,UBYTE *name)
  271. {
  272.  long rc = 0;
  273.  char buffer1[STR_SIZE],buffer2[STR_SIZE],buffer3[STR_SIZE];
  274.  long t;
  275.  struct tm *date;
  276.  time(&t);
  277.  date = localtime(&t);
  278.  *(info->Statusline) = '\0';
  279.  *buffer1 = '\0';
  280.  *buffer2 = '\0';
  281.  *buffer3 = '\0';
  282.  if(info->flags.date) sprintf(buffer1,DATE_FORMAT);
  283.  if(info->flags.time) sprintf(buffer2,TIME_FORMAT);
  284.  if(info->flags.file) sprintf(buffer3,NAME_FORMAT);
  285.  if((*(buffer1)) || (*(buffer2)) || (*(buffer3)))
  286.  {
  287.   sprintf(info->Statusline,"*** %s%s%s ***",buffer1,buffer2,buffer3);
  288.   rc += 1;
  289.  }
  290.  if(info->flags.page)rc += 1;
  291.  if(*(info->Headline))rc += 2;
  292.  if(*(info->Footline))rc += 1;
  293.  return rc;
  294. }
  295.  
  296. void __regargs PrintSettings(struct prf_info *info,FILE *printer)
  297. {
  298.   if(info->Columns <= 0L) info->Columns = 1L;
  299.   if(info->flags.draft)  fprintf(printer,"\x1b[1\x22z");
  300.   if(info->flags.lq)     fprintf(printer,"\x1b[2\x22z");
  301.   if(info->flags.pitch == 1) fprintf(printer,"\x1b[1z");
  302.   if(info->flags.pitch == 2) fprintf(printer,"\x1b[0z");
  303.   if(info->flags.cpi   == 1)  fprintf(printer,"\x1b[0w");
  304.   if(info->flags.cpi   == 2)  fprintf(printer,"\x1b[0w\x1b[2w");
  305.   if(info->flags.cpi   == 3)  fprintf(printer,"\x1b[0w\x1b[4w");
  306. }
  307.